﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Excecoes;
using LM.InterfacesFabricas.Fabricas;
using LM.InterfacesFabricas.Interfaces.Servicos;
using NUnit.Framework;

namespace LM.TesteUnitario
{
  
     using NUnit.Framework;

    [TestFixture]
    class TesteServicoDeTipoDeVeiculo
    {
        private IServicoTipoVeiculo _servicoTipoDeVeiculo;

        [SetUp]
        public void SetUp()
        {
            _servicoTipoDeVeiculo = FabricaGenerica.Crie<IServicoTipoVeiculo>();
        }

        [TestFixtureTearDown]
        public void TestFixtureTearDown()
        {
            LimpeDados();
        }

        [Test]
        public void TesteCadastreComSucesso()
        {
            LimpeDados();
            var dtoTipoVeiculo = new DtoTipoDeVeiculo() { Codigo = 123, Descricao = "Fiat" };

            _servicoTipoDeVeiculo.Cadastre(dtoTipoVeiculo);
        }

        [Test]
        [ExpectedException(typeof(InconsistenciasException))]
        public void TesteCadastreComInconsistencia()
        {
            var dtoTipoVeiculo = new DtoTipoDeVeiculo() { Codigo = 1, Descricao = "" };

            _servicoTipoDeVeiculo.Cadastre(dtoTipoVeiculo);
        }

        [Test]
        public void TesteAtualizeComSucesso()
        {
            LimpeDados();
            InicializeDados();
            const string novaDescricao = "Nova descrição 123";

            var tipoDeVeiculo = _servicoTipoDeVeiculo.Consulte(123);
            tipoDeVeiculo.Descricao = novaDescricao;
            _servicoTipoDeVeiculo.Atualize(tipoDeVeiculo);

            tipoDeVeiculo = _servicoTipoDeVeiculo.Consulte(123);
            Assert.AreEqual(novaDescricao, tipoDeVeiculo.Descricao);
        }

        [Test]
        public void TesteExcluaComSucesso()
        {
            LimpeDados();
            InicializeDados();

            var tipoDeVeiculo = _servicoTipoDeVeiculo.Consulte(999);
            Assert.IsNotNull(tipoDeVeiculo);
            Assert.AreEqual(123, tipoDeVeiculo.Codigo);

            _servicoTipoDeVeiculo.Exclua(123);
            tipoDeVeiculo = _servicoTipoDeVeiculo.Consulte(123);

            Assert.IsNull(tipoDeVeiculo);
        }

        [Test]
        public void TesteConsulteTodosComSucesso()
        {
            LimpeDados();
            InicializeDados();

            Assert.Greater(FabricaGenerica.Crie<IServicoTipoVeiculo>().ConsulteTodos().Count, 0);
        }

        private void InicializeDados()
        {
            FabricaGenerica.Crie<IServicoTipoVeiculo>().Cadastre(new DtoTipoDeVeiculo()
                                                                 {
                                                                     Codigo = 123,
                                                                     Descricao = "Descrição 123"
                                                                 });
        }

        private void LimpeDados()
        {
            var servicoTipoDeVeiculo = FabricaGenerica.Crie<IServicoTipoVeiculo>();

            var tipoDeVeiculo = servicoTipoDeVeiculo.Consulte(123);
            if (tipoDeVeiculo != null)
            {
                servicoTipoDeVeiculo.Exclua(tipoDeVeiculo.Codigo);
            }
        }
    }
}
